package com.warski.wonderfires.utils.task;

import com.warski.wonderfires.utils.BasicUtils;
import com.warski.wonderfires.utils.Logger;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by xuhaiping on 2020/7/13.
 * 跑定时任务用的
 */
public class TaskUtils {
    private ScheduledExecutorService service;

    /**
     * 循环任务，立即执行一次，随后间隔period秒再次执行，直到程序结束
     * @param task
     * @param period
     */
    public void loopTask(BasicTask task, long period) {
        shutdown();

        Logger.info(String.format("新增定时任务:%s,立即启动,任务间隔时间%s秒", task.getName(), period));
        service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(task, 0, period, TimeUnit.SECONDS);
    }

    /**
     * 循环任务，time是00:00:00~23:59:59中的任意时间，每天到这个时间执行一次
     * @param task
     * @param time
     */
    public void loopTask(BasicTask task, String time/*00:00:00~23:59:59*/) {
        shutdown();

        long oneDay = 24 * 60 * 60;
        long initDelay  = (BasicUtils.getTimeMillis(time) - System.currentTimeMillis()) / 1000;
        initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;
        Logger.info(String.format("新增定时任务:%s,%d秒后启动,任务间隔时间%s秒", task.getName(), initDelay, oneDay));
        service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(task, initDelay, oneDay, TimeUnit.SECONDS);
    }

    /**
     * 一次性任务，delay秒之后启动一次
     * @param task
     * @param delay
     */
    public void oneTimeTask(BasicTask task, long delay) {
        shutdown();

        Logger.info(String.format("新增定时任务:%s,时间%s秒后启动一次", task.getName(), delay));
        service = Executors.newSingleThreadScheduledExecutor();
        service.schedule(task, delay, TimeUnit.SECONDS);
    }

    /**
     * 基本不会用到，循环任务跑起来就不打算停的
     */
    public void shutdown(){
        if(service != null){
            service.shutdown();
        }
    }
}
